/**
* @file        loc_types
* @brief       
* @version     1.0.0
* @author      Changlin.Jing 
* @date        2023/7/27 19:43
* @copyright   Copyright  2022 Langge Software Co., Ltd. All rights reserved.
*/
#ifndef LANGGE_VDR_LOC_TYPES_H
#define LANGGE_VDR_LOC_TYPES_H
#include <string>
#include "loc_signal_type.h"

enum PlatformType{
    PLATFORM_TYPE_NULL = 0,     /// 0-默认值
    PLATFORM_TYPE_PHONE,        /// 1-手机平台
    PLATFORM_TYPE_AUTO,          /// 2-车机平台
    PLATFORM_TYPE_IPHONE        /// 3-手机平台(iOS)
};

enum LocWorkMode{
    LOC_WORK_MODE_REALTIME = 0,     //实时模式
    LOC_WORK_MODE_PLAYBACK,         //回放模式
};

enum NaviType{
    // 0-默认值
    NAVI_TYPE_NULL = 0,
    // 1-驾车
    NAVI_TYPE_DRIVING,
    NAVI_TYPE_DRIVING_SIMULATE,
    NAVI_TYPE_COUNT
};

enum MapSceneType{
    // 默认场景
    MAP_SCENE_TYPE_DEFAULT = 0 ,
    // 导航场景
    MAP_SCENE_TYPE_NAVI,
    // 巡航场景
    MAP_SCENE_TYPE_CRUISE,
    // 地图场景数量
    MAP_SCENE_TYPE_COUNT
};

struct WorkState{
    void init() {
        mPlatformType  = PLATFORM_TYPE_NULL;
        mWorkMode = LOC_WORK_MODE_REALTIME;
        mNaviType = NAVI_TYPE_NULL;
        mSceneType = MAP_SCENE_TYPE_DEFAULT;
    }

    WorkState(){
        init();
    }
    virtual ~WorkState()= default;
    PlatformType mPlatformType = PLATFORM_TYPE_PHONE;
    LocWorkMode mWorkMode = LOC_WORK_MODE_REALTIME;
    NaviType mNaviType = NAVI_TYPE_NULL;
    MapSceneType mSceneType = MAP_SCENE_TYPE_DEFAULT;
    std::string mUuid{};
};

class LocationInfo{
public:
    std::uint64_t  mLocalTickTime {0};
    double m_dLon{};
    double m_dLat{};      // 纬度
    double m_dHeight{};   // 高程
    double yaw;           // 偏航角
    double pitch;         // 俯仰角
    double roll;          // 横滚角
    // 经度
    double m_dAcc{};     // 精度
    double m_dSpeed{};   // 速度
    double m_dAngle{};   // 角度（单位：度）
    double m_dIMUDirection{}; // 磁力计角度
    double m_dAlt{};     // 海拔高度
    int32_t m_iStatus{}; // 定位状态 0 为定位  1 二维定位   2 三维定位
    int32_t m_iFixedSatelliteNum{0};
    int32_t m_iTotalSatelliteNum{0};
    double m_dAvgSNR{0};
};

class  ILocationObserver {
public:
    virtual void OnLocationChanged(LocationInfo &locInfo) = 0;

    virtual void OnGpsSignalWeak(bool isWeak) = 0;
    bool IsNeedUpdate(uint64_t ts, bool IsRawGps);

    // 是否单次定位
    void SetOnceLocation(bool isOnceLocation);

    // 回调时间间隔
    void SetInterval(std::int32_t interval);

private:
    /// 位置回调频率
    bool mIsOnceLocation = false;
    bool mIsFinishCallBack = false;
    std::int32_t mInterval = 100;
    std::uint64_t mLastLocationTimestamp = 0L;
    // 超过 间隔的 1.05 倍时进行回调
    float mIntervalFactor = 1.1f;
};




#endif //LANGGE_VDR_LOC_TYPES_H
